package com.zmh.common;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <p>
 * Title:公共工具类
 * </p>
 */
public class DateUtil {
	private static Logger logger = LoggerFactory.getLogger(DateUtil.class);
//	private static Calendar cale = Calendar.getInstance();

	/**
	 * 获得服务器当前日期及时间(毫秒)，以格式为：yyyy-MM-dd HH:mm:ss:SSS的日期字符串形式返回
	 * @author zhoumh
	 * @version 创建时间：2017年6月27日 下午4:37:04
	 * @return yyyy-MM-dd HH:mm:ss:SSS
	 */
	public static String getDateTimes() {
		final String FORMAT = "yyyy-MM-dd HH:mm:ss:SSS"; //日期转换格式
		try {
			return new SimpleDateFormat(FORMAT).format(System.currentTimeMillis());
		} catch (Exception e) {
			logger.debug("DateUtil.getDateTime():" + e.getMessage());
			return "";
		}
	}
	/**
	 * 获得服务器当前日期及时间，以格式为：yyyy-MM-dd HH:mm:ss的日期字符串形式返回
	 * @author zhoumh
	 * @version 创建时间：2017年6月27日 下午4:37:04
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String getDateTime() {
		final String FORMAT = "yyyy-MM-dd HH:mm:ss"; //日期转换格式
		try {
			return new SimpleDateFormat(FORMAT).format(System.currentTimeMillis());
		} catch (Exception e) {
			logger.debug("DateUtil.getDateTime():" + e.getMessage());
			return "";
		}
	}
	/**
	 * 将传入的date转换格式，以格式为：yyyy-MM-dd HH:mm:ss的日期字符串形式返回
	 * @author zhoumh
	 * @version 创建时间：2017年6月27日 下午4:37:04
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String getDateTime(Date date) {
		final String FORMAT = "yyyy-MM-dd HH:mm:ss"; //日期转换格式
		try {
			return new SimpleDateFormat(FORMAT).format(date);
		} catch (Exception e) {
			logger.debug("DateUtil.getDateTime():" + e.getMessage());
			return "";
		}
	}
	/**
	 * 获得服务器当前日期，以格式为：yyyy-MM-dd的日期字符串形式返回
	 * @author zhoumh
	 * @version 创建时间：2017年6月27日 下午4:37:11
	 * @return yyyy-MM-dd
	 */
	public static String getDate() {
		final String FORMAT = "yyyy-MM-dd"; //日期转换格式
		try {
			return new SimpleDateFormat(FORMAT).format(System.currentTimeMillis());
		} catch (Exception e) {
			logger.debug("DateUtil.getDate():" + e.getMessage());
			return "";
		}
	}

	/**
	 * 获得服务器当前时间，以格式为：HH:mm:ss的时间字符串形式返回
	 * @author zhoumh
	 * @version 创建时间：2017年6月27日 下午4:36:05
	 * @return HH:mm:ss
	 */
	public static String getTime() {
		final String FORMAT = "HH:mm:ss"; //时间转换格式
		try {
			return new SimpleDateFormat(FORMAT).format(System.currentTimeMillis());
		} catch (Exception e) {
			logger.debug("DateUtil.getTime():" + e.getMessage());
			return "";
		}
	}
	
	/**
	 * 计算传入的时间与当前时间相差的秒数
	 * @author zhoumh
	 * @version 创建时间：2017年6月27日 下午5:02:45
	 * @return long 相差的秒数
	 */
	public static long getSecDiff(String d) {
	    long ns = 1000;  //相差的秒
	    //将传入的时间字符串转换为日期格式
	    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
		// 获得传入时间与当前时间的毫秒时间差异
		long diff = 0;
		try {
			diff = System.currentTimeMillis()-formatter.parse(d).getTime();
		} catch (ParseException e) {
			logger.error("时间计算错误");
			e.printStackTrace();
		}
		// 计算差多少秒
		long sec = diff / ns;
		return sec;
	}
	
	/**
	 * 计算传入的时间与当前时间相差的分钟数
	 * @param d yyyy-MM-dd HH:mm:ss:SSS
	 * @author zhoumh
	 * @version 创建时间：2017年6月27日 下午5:01:53
	 * @return long 相差的分钟数
	 */
	public static long getMinDiff(String d) {
	    long nm = 1000 * 60; //相差的分钟
	    //将传入的时间字符串转换为日期格式
	    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
		// 获得传入时间与当前时间的毫秒时间差异
		long diff = 0;
		try {
			diff = System.currentTimeMillis()-formatter.parse(d).getTime();
		} catch (ParseException e) {
			logger.error("时间计算错误");
			e.printStackTrace();
		}
		// 计算差多少分钟
		long min = diff / nm;
		return min;
	}
	
	/**
	 * 计算传入的时间与当前时间相差的小时数
	 * @param d yyyy-MM-dd HH:mm:ss:SSS
	 * @author zhoumh
	 * @version 创建时间：2017年6月27日 下午5:02:45
	 * @return long 相差的小时数
	 */
	public static long getHourDiff(String d) {
	    long nh = 1000 * 60 * 60;  //相差的小时
	    //将传入的时间字符串转换为日期格式
	    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
		// 获得传入时间与当前时间的毫秒时间差异
		long diff = 0;
		try {
			diff = System.currentTimeMillis()-formatter.parse(d).getTime();
		} catch (ParseException e) {
			logger.error("时间计算错误");
			e.printStackTrace();
		}
		// 计算差多少小时
		long hour = diff / nh;
		return hour;
	}
	
	/**
	 * 计算传入的时间与当前时间相差的天数
	 * @param d yyyy-MM-dd HH:mm:ss:SSS
	 * @author zhoumh
	 * @version 创建时间：2017年6月27日 下午5:02:45
	 * @return long 相差的天数
	 */
	public static long getDayDiff(String d) {
		long nd = 1000 * 24 * 60 * 60; //相差的天数
	    //将传入的时间字符串转换为日期格式
	    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
		// 获得传入时间与当前时间的毫秒时间差异
		long diff = 0;
		try {
			diff = System.currentTimeMillis()-formatter.parse(d).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
			logger.error("计算错误");
		}
		// 计算差多少天
		long day = diff / nd;
		return day;
	}
	
	/**
	 * 给传入的时间增加小时
	 * @param dt 时间基数 2017-06-27 14:29:10
	 * @param h 要增加的小时数 2
	 * @return: String 增加小时之后的时间 2017-06-27 16:29:10
	 * @author: zhoumh
	 * @version: 创建时间：2017年11月15日 上午8:54:31 
	 * @Description:
	 */
	public static String addHour(String dt,int h){
		//将小时数转换成毫秒
	    long ms = h * 60 * 60 * 1000;
	    //日期格式转换
	    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 将传入时间转换成毫秒格式
		long ts = 0;
		try {
			ts = formatter.parse(dt).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
			logger.error("计算错误");
		}
		return formatter.format(ts + ms);
	}
	/**
	 * 给传入的时间增加分钟
	 * @param dt 时间基数 2017-06-27 14:29:10
	 * @param h 要增加的分钟数 10
	 * @return: String 增加小时之后的时间 2017-06-27 14:39:10
	 * @author: zhoumh
	 * @version: 创建时间：2017年11月15日 上午8:54:31 
	 * @Description:
	 */
	public static String addMin(String dt,int m){
		//将小时数转换成毫秒
	    long ms = m * 60 * 1000;
	    //日期格式转换
	    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 将传入时间转换成毫秒格式
		long ts = 0;
		try {
			ts = formatter.parse(dt).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
			logger.error("计算错误");
		}
		return formatter.format(ts + ms);
	}
	
	/**
	 * 给传入的时间减分钟
	 * @param dt 时间基数 2017-06-27 14:29:10
	 * @param h 要减少的分钟数 10
	 * @return: String 增加小时之后的时间 2017-06-27 14:19:10
	 * @author: zhoumh
	 * @version: 创建时间：2017年11月15日 上午8:54:31 
	 * @Description:
	 */
	public static String subMin(String dt,int m){
		//将小时数转换成毫秒
	    long ms = m * 60 * 1000;
	    //日期格式转换
	    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 将传入时间转换成毫秒格式
		long ts = 0;
		try {
			ts = formatter.parse(dt).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
			logger.error("计算错误");
		}
		return formatter.format(ts - ms);
	}
	/**
	 * 将传入的毫秒时间戳转为日时间格式
	 * @param ms 毫秒值
	 * @return: String yyyy-MM-dd HH:mm:ss
	 * @author: zhoumh
	 * @version: 创建时间：2017年11月12日 上午8:22:20 
	 * @Description:
	 */
	public static String convertDateTimesByms(long ms){
		final String FORMAT = "yyyy-MM-dd HH:mm:ss"; //日期转换格式
		try {
			return new SimpleDateFormat(FORMAT).format(ms);
		} catch (Exception e) {
			logger.debug("DateUtil.convertDateTimesByms():" + e.getMessage());
			return "";
		}
	}
	/**
	 * 比较两个时间的大小
	 * @param d1 时间参数1 2017-06-27 14:29:10
	 * @param d2 时间参数2 2017-06-27 14:29:10
	 * @return: int 1 d1>d2,-1 d1<d2,0 d1=d2 
	 * @author: zhoumh
	 * @version: 创建时间：2017年11月15日 上午10:41:41 
	 * @Description:
	 */
	public static int compareDate(String dt1,String dt2){
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		long d1 = 0;
		long d2 = 0;
		try {
			d1 = formatter.parse(dt1).getTime();
			d2 = formatter.parse(dt2).getTime();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        if (d1 > d2) {
            return 1;
        } else if (d1 < d2) {
            return -1;
        } else {//相等
            return 0;
        }
}
}
